GPIO(General Purpose Input Output),即通用输入输出口,是 STM32 单片机中最基础也最常用的外设之一。它就像单片机与外部世界的 “桥梁”,让我们能读取按键、传感器的信号,也能控制 LED、电机、显示屏等设备的动作。本文将从 GPIO 的工作原理、配置方法、典型应用三个维度,带你全面掌握 STM32 GPIO 的使用。
一、GPIO 的工作原理与硬件结构
STM32 的 GPIO 引脚并非简单的 “导线”,而是由多路复用器、模式控制电路、上下拉电阻、输出驱动电路等模块组成的复杂系统。以 STM32F103 系列为例,每个 GPIO 引脚都支持以下核心功能:
1.模式分类
| GPIO_Mode | 描述 | |
|---|---|---|
| GPIO_Mode_AIN | 模拟输入 | 用于 ADC 采样,引脚信号直接接入模拟电路。 |
| GPIO_Mode_IN_FLOATING | 浮空输入 | 引脚电平完全由外部电路决定,无内部上下拉; |
| GPIO_Mode_IPD | 下拉输入 | 内部下拉电阻将引脚默认拉至低电平,外部高电平信号可被正确读取; |
| GPIO_Mode_IPU | 上拉输入 | 内部上拉电阻将引脚默认拉至高电平,外部低电平信号可被正确读取; |
| GPIO_Mode_Out_OD | 开漏输出 | 仅能主动拉低电平,高电平需外部上拉电阻实现,常用于 I2C 等总线通信; |
| GPIO_Mode_Out_PP | 推挽输出 | 可主动输出高电平(VCC)或低电平(GND),驱动能力强; |
| GPIO_Mode_AF_OD | 复用开漏输出 | 引脚功能被复用为串口、定时器等外设的输出(如 USART 的 TX 引脚)。 |
| GPIO_Mode_AF_PP | 复用推挽输出 | 引脚功能被复用为串口、定时器等外设的输出(如 USART 的 TX 引脚)。 |
2.IO输出速度
| GPIO_Speed | 描述 |
|---|---|
| GPIO_Speed_2MHz | 低速 |
| GPIO_Speed_10MHz | 中速 |
| GPIO_Speed_50MHz | 高速 |
二、GPIO 的配置流程(以标准库为例)
在 STM32 开发中,配置 GPIO 通常遵循 “时钟使能→模式配置→上下拉 / 速度设置→功能使能” 的流程。以下是一个完整的配置示例:
分别对两个IO口进行初始化,GPIOC_Pin_13为推挽输出,GPIOB_Pin_4为上拉输入。
#include "stm32f10x.h"
int main(void)
{
//开启GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
//初始化GPIO
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC, &GPIO_InitStruct);
//把GPIO_InitStruct 中的每一个参数按缺省值填入
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStruct);
while(1)
{
if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_4) == Bit_RESET){
GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);
}
else{
//设置或者清除指定的数据端口位
GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);
}
}
}
首先需要开启相应GPIO的时钟;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
接着就是创建GPIO的结构体,配置好参数后,使用GPIO_Init();函数进行初始化;
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13; //IO口
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //模式为推挽输出
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz; //GPIO输出频率
GPIO_Init(GPIOC, &GPIO_InitStruct);
初始化后就可以使用GPIO_WriteBit();单独控制某一个IO口。
三、GPIO 使用的注意事项
- 引脚复用冲突:STM32 的部分 GPIO 引脚具有多外设复用功能(如 PA9/PA10 同时是 USART1 的 TX/RX),使用时需避免功能冲突;
- 驱动能力与负载:GPIO 输出电流有限,驱动大功率负载(如电机)需外接驱动电路(如三极管、MOS 管);
- 抗干扰设计:对于外部输入信号(如传感器、按键),需通过 RC 滤波、施密特触发器等硬件或软件消抖提升稳定性;
- 低功耗考虑:闲置的 GPIO 建议配置为模拟输入或上拉 / 下拉输入,避免浮空状态引入的额外功耗。

